package com.finer.service.goods.impl;

import com.alibaba.cloud.commons.lang.StringUtils;
import com.finer.dao.goods.WarehouseGoodsTypeDao;
import com.finer.dto.warehouse.GoodsTypePageDTO;
import com.finer.entity.ResponseMessage;
import com.finer.entity.document.FinerGoodsType;
import com.finer.service.goods.WarehouseGoodsTypeService;
import com.finer.utils.PageUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author wangenhao
 * @className WarehouseGoodsTypeServiceImpl
 * @description 商品分类service实现类
 * @date 2024-10-23 上午1:02
 **/
@Service
@Slf4j
public class WarehouseGoodsTypeServiceImpl implements WarehouseGoodsTypeService {

    @Autowired
    private WarehouseGoodsTypeDao warehouseGoodsTypeDao;

    /**
     * @return com.finer.entity.ResponseMessage
     * @description 获取商品分类分页
     * @date 2024/10/23 上午1:22
     * @Param goodsTypePageDTO:
     **/
    public ResponseMessage getGoodsTypePage(GoodsTypePageDTO goodsTypePageDTO) {
        int pageNum = 1;
        int pageSize = 10;
        if (goodsTypePageDTO.getPageNum() != null) {
            pageNum = goodsTypePageDTO.getPageNum();
        }
        if (goodsTypePageDTO.getPageSize() != null) {
            pageSize = goodsTypePageDTO.getPageSize();
        }
        if (StringUtils.isBlank(goodsTypePageDTO.getTypeName()) && StringUtils.isBlank(goodsTypePageDTO.getTypeCode())) {
            goodsTypePageDTO.setParentId(0);
        }
        Page<FinerGoodsType> page = PageHelper.startPage(pageNum, pageSize);
        List<FinerGoodsType> goodsTypeList = warehouseGoodsTypeDao.getGoodsTypeList(goodsTypePageDTO);
        List<FinerGoodsType> goodsTypeChilrenList = new ArrayList<>();
        for (FinerGoodsType goodsType : goodsTypeList) {
            goodsTypeChilrenList.addAll(getGoodsTypeChilrenList(goodsType.getId()));
            log.info("goodsTypeChilrenList: {}", goodsTypeChilrenList);
        }
        goodsTypeList.addAll(goodsTypeChilrenList);
        List<FinerGoodsType> resList = goodsTypeList
                .stream()
                .filter(goodsType -> {
                    return Objects.equals(goodsType.getParentId(), 0);
                })
                .map(goodsType -> {
                    goodsType.setChildren(getChildrenList(goodsType.getId(), goodsTypeList));
                    return goodsType;
                })
                .collect(Collectors.toList());
        log.info("resList: {}", resList);
        log.info("WarehouseGoodsTypeServiceImpl getGoodsTypePage，pageNum: {}, pageSize: {}, total: {}, pages: {}, data: {}", pageNum, pageSize, page.getTotal(), page.getPages(), goodsTypeList);
        PageUtil<FinerGoodsType> pageUtil = new PageUtil<>();
        pageUtil.setPageNum(pageNum);
        pageUtil.setPageSize(pageSize);
        pageUtil.setTotal(page.getTotal());
        pageUtil.setPages(page.getPages());
        pageUtil.setData(resList);
        return ResponseMessage.success(pageUtil);
    }

    /**
     * @return com.finer.entity.ResponseMessage
     * @description 添加商品分类
     * @date 2024/10/23 上午10:34
     * @Param finerGoodsType:
     **/
    public ResponseMessage addGoodsType(FinerGoodsType finerGoodsType) {
        if (StringUtils.isBlank(finerGoodsType.getTypeName())) {
            return ResponseMessage.error("500", "分类名称不能为空");
        }
        //TODO 商品分类编码校验重复
        if (StringUtils.isBlank(finerGoodsType.getTypeCode())) {
            return ResponseMessage.error("500", "分类编码不能为空");
        }
        if (finerGoodsType.getParentId() == null) {
            finerGoodsType.setParentId(0);
        }
        finerGoodsType.setCreateBy(1);
        finerGoodsType.setCreateDate(new Date());
        int addNum = warehouseGoodsTypeDao.addGoodsType(finerGoodsType);
        log.info("WarehouseGoodsTypeServiceImpl addGoodsType finerGoodsType: {} addNum:{}", finerGoodsType, addNum);
        if (addNum > 0) {
            return ResponseMessage.success();
        }
        return ResponseMessage.error("500", "添加失败");
    }

    /**
     * @return com.finer.entity.ResponseMessage
     * @description 根据id查询商品分类
     * @date 2024/10/23 上午10:46
     * @Param id:
     **/
    public ResponseMessage getGoodsTypeById(Integer id) {
        if (id == null) {
            return ResponseMessage.error("500", "分类id不能为空");
        }
        FinerGoodsType goodsType = warehouseGoodsTypeDao.getGoodsTypeById(id);
        log.info("WarehouseGoodsTypeServiceImpl getGoodsTypeById id: {} goodsType: {}", id, goodsType);
        return ResponseMessage.success(goodsType);
    }

    /**
     * @return com.finer.entity.ResponseMessage
     * @description 更新商品分类
     * @date 2024/10/23 上午10:57
     * @Param finerGoodsType:
     **/
    public ResponseMessage updateGoodsType(FinerGoodsType finerGoodsType) {
        if (finerGoodsType.getId() == null) {
            return ResponseMessage.error("500", "商品id不能为空");
        }
        if (StringUtils.isBlank(finerGoodsType.getTypeName())) {
            return ResponseMessage.error("500", "分类名称不能为空");
        }
        finerGoodsType.setModifyDate(new Date());
        finerGoodsType.setModifyBy(1);
        int updNum = warehouseGoodsTypeDao.updateGoodsType(finerGoodsType);
        log.info("WarehouseGoodsTypeServiceImpl updateGoodsType finerGoodsType: {} updNum:{}", finerGoodsType, updNum);
        if (updNum > 0) {
            return ResponseMessage.success();
        }
        return ResponseMessage.error("500", "更新失败");
    }

    /**
     * @return com.finer.entity.ResponseMessage
     * @description 根据id删除商品分类
     * @date 2024/10/23 上午11:37
     * @Param id:
     **/
    public ResponseMessage deleteGoodsType(Integer id) {
        //TODO: 校验商品分类下是否有商品
        FinerGoodsType finerGoodsType = new FinerGoodsType();
        finerGoodsType.setId(id);
        finerGoodsType.setIsDel(1);
        finerGoodsType.setModifyBy(1);
        finerGoodsType.setModifyDate(new Date());
        int delNum = warehouseGoodsTypeDao.updateGoodsType(finerGoodsType);
        log.info("WarehouseGoodsTypeServiceImpl deleteGoodsType id: {} delNum:{}", id, delNum);
        if (delNum > 0) {
            return ResponseMessage.success();
        }
        return ResponseMessage.error("500", "删除失败");
    }

    /**
     * @return com.finer.entity.ResponseMessage
     * @description 校验商品分类编码是否存在
     * @date 2024/10/23 下午3:37
     * @Param typeCode:
     **/
    public ResponseMessage checkGoodsTypeCode(String typeCode) {
        //分类编号不能为空
        if (StringUtils.isBlank(typeCode)) {
            return ResponseMessage.error("500", "商品分类编码不能为空");
        }

        //根据分类编号获取分类编码数量
        int count = warehouseGoodsTypeDao.getGoodsTypeCountByCode(typeCode);
        log.info("WarehouseGoodsTypeServiceImpl checkGoodsTypeCode typeCode: {} count:{}", typeCode, count);

        //如果数量大于0，则说明分类编码已存在
        if (count > 0) {
            return ResponseMessage.error("500", "商品分类编码已存在,请重新刷新!");
        }
        return ResponseMessage.success();
    }


    /**
     * @return java.util.List<com.finer.entity.document.FinerGoodsType>
     * @description 从数据库中获取子分类
     * @date 2024/10/23 上午10:25
     * @Param parentId:
     **/
    public List<FinerGoodsType> getGoodsTypeChilrenList(Integer parentId) {
        List<FinerGoodsType> res = new ArrayList<>();
        List<FinerGoodsType> childrenList = null;
        GoodsTypePageDTO goodsTypePageDTO = new GoodsTypePageDTO();
        goodsTypePageDTO.setParentId(parentId);
        childrenList = warehouseGoodsTypeDao.getGoodsTypeList(goodsTypePageDTO);
        if (childrenList != null && !childrenList.isEmpty()) {
            res.addAll(childrenList);
            for (FinerGoodsType goodsType : childrenList) {
                res.addAll(getGoodsTypeChilrenList(goodsType.getId()));
            }
        }
        return res;
    }

    /**
     * @return java.util.List<com.finer.entity.document.FinerGoodsType>
     * @description 递归获取子分类
     * @date 2024/10/23 上午10:26
     * @Param parentId:
     * @Param goodsTypeList:
     **/
    public List<FinerGoodsType> getChildrenList(Integer parentId, List<FinerGoodsType> goodsTypeList) {
        List<FinerGoodsType> childrenList = goodsTypeList
                .stream()
                .filter(goodsType -> {
                    return Objects.equals(goodsType.getParentId(), parentId);
                })
                .map(goodsType -> {
                    goodsType.setChildren(getChildrenList(goodsType.getId(), goodsTypeList));
                    return goodsType;
                })
                .collect(Collectors.toList());
        log.info("childrenList: {}", childrenList);
        return childrenList;
    }
}
